 ;-----------------------------\
 ;escape 4k demo                 \
 ;made for code craft contest      \
 ;code - tom/kulture 1999            \
 ;------------------------------------ \

 ;planes---------------------------------------------------------------|
 ;Wait incase showing this one..
 ldr r5,work
.p_waitv
 ldr r6,show
 cmp r6,r5
 ;if the shown bank is the one we are about to write on we must wait..
 beq p_waitv


 ;setup addresses
 ldr r12,video
 sub r5,r5,#1
 mov r6,r5,lsl #7
 add r6,r6,r5,lsl #5
 add r12,r12,r6,lsl #8

 ldr r11,div
 ldr r10,bump
 ;
 ldr r9,z
 mov r9,r9,asr #1
 adr r7,lc
 ldmia r7,{r7-r8}
 sub r7,r7,#512
 sub r8,r8,#512
 add r8,r8,r9

 mov r14,#yres
 str r14,p_ycount
.planes_yloop
 ldr r14,env
 adr r3,oc
 stmia r3,{r0-r2}
 mov r13,#xres
.planes_xloop

 ;r14=yp
 ;r13=xp
 ;r12=screen
 ;r11=div
 ;r10=texture
 ;r9=ez
 ;r8=lz
 ;r7=lx
 ;---------------------
 ;r0-x r1-y (eg 160,128) r2-z (256 length)
 ;---------------------------------------
 movs r5,r1,asr #14
 mvnlt r5,r5
 mov r3,r0,asr #14
 mov r4,r2,asr #14
 ;
 cmp r5,#16
 movle r4,#0
 ble planes_plot
 ;load from division table
 ldr r5,[r11,r5,lsl #2]
 ;r5=t<<14
 ;--------

 ;find coords given dx,dz,t
 mul r3,r5,r3
 mul r4,r5,r4
 mov r3,r3,asr #14-6
 mov r4,r4,asr #14-6
 add r4,r4,r9
 ;r3=x r4=z

 ;caclulate light distance from x/z hit...
 sub r5,r3,r7
 sub r6,r4,r8
 ;load bump direction...
 and r3,r3,#63
 and r4,r4,#63
 add r3,r3,r4,lsl #6
 ldr r3,[r10,r3,lsl #2]

 mov r4,r3,asr #8 ;z
 and r3,r3,#&ff ;x

 adds r3,r3,r5,asr #1
 movlt r3,#0
 adds r4,r4,r6,asr #1
 movlt r4,#0
 cmp r3,#127
 movgt r3,#127
 cmp r4,#127
 movgt r4,#127

 add r3,r3,r4,lsl #7

 ldrb r4,[r14,r3]
.planes_plot
 strb r4,[r12],#1
 strb r4,[r12],#1
 ;move pixel on virtual screen +loop
 adr r3,vx
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 subs r13,r13,#1
 bne planes_xloop
 ;copy line
 mov r13,#(xscreen/(4*8))
 sub r4,r12,#xscreen/2
 mov r5,r12
 add r6,r12,#xscreen/2
 add r12,r12,#xscreen
.p_cloop
 ldmia r4!,{r0-r3}
 stmia r5!,{r0-r3}
 stmia r6!,{r0-r3}
 stmia r12!,{r0-r3}
 subs r13,r13,#1
 bne p_cloop
 ;reload old x coordinate
 adr r0,oc
 ldmia r0,{r0-r2}
 ;move pixel on v screen down
 adr r3,vy
 ldmia r3,{r3-r5}
 add r0,r0,r3
 add r1,r1,r4
 add r2,r2,r5
 ldr r14,p_ycount
 subs r14,r14,#1
 str r14,p_ycount
 bne planes_yloop

 ldr r1,work
 subs r1,r1,#1
 moveq r1,#3
 str r1,work

 b loop

.p_ycount
 dcd 0
